package com.xj.config;

import com.xj.bean.Color;
import com.xj.bean.ColorFactoryBean;
import com.xj.bean.Person;
import com.xj.bean.Red;
import com.xj.condition.LinuxCondition;
import com.xj.condition.MyImportBeanDefinitionRegistrar;
import com.xj.condition.MyImportSelector;
import com.xj.condition.WindowsCondition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;

/**
 * 组件注册
 * @author xujiang
 * @date 2021/1/20 21:36
 */
@Conditional({WindowsCondition.class})//类中组件统一配置
@Configuration
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MyConfig2 {

    /**
     * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
     * @see ConfigurableBeanFactory#SCOPE_SINGLETON
     * prototype    多实例 ioc容器启动不会调用方法创建对象，每次获取才会调用方法创建
     * singleton    单实例 默认的 ioc容器启动会调用方法创建Bean对象
     * request  同义词请求创建一个实例
     * session  同一个session创建一个实例
     * @return Bean bean
     * 懒加载：
     *      单实例bean在ioc容器启动会调用方法创建Bean对象
     *      懒加载，容器启动不创建对象，第一次使用Bean创建对象，并初始化
     */
//    @Scope("prototype")
    @Bean
    @Lazy
    public Person person() {
        System.out.println("给容器中添加Person...");
        return new Person("小红", 18);
    }


    @Bean("bill")
    public Person person01() {
        return new Person("Bill Gates", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person02() {
        return new Person("linus", 50);
    }
    /**
     * 给容器中注册组件：
     * 1、包扫描+组件标注注解（@Controller/@Service/@Repository/@Component
     * 2、@Bean【导入第三方包的组件】
     * 3、@Import[快速给容器中导入组件]
     *      1、@Import（要导入到容器中的组件）；容器中就会自动注册这个组件，id默认是全类名
     *      2、ImportSelector:返回需要导入的组件的全类名数组
     *      3、ImportBeanDefinitionRegistrar:手动注册bean到容器中
     * 4、使用Spring提供的FactoryBean(工厂Bean)
     *      1、默认获取到的是工厂bean调用getObject创建的对象
     *      2、要获取工厂Bean本身，需要给id前面加上一个&
     *          &colorFactoryBean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}
